package reflection.proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @program: javase
 * @description: CGlib动态代理
 * @author: lld
 * @create: 2021-03-15 19:09
 **/
public class CGlibProxy {
    static <T> Object getProxy(T t){
        Enhancer en = new Enhancer(); //帮我们生成代理对象
        en.setSuperclass(t.getClass());//设置要代理的目标类
        en.setCallback(new MethodInterceptor() {//代理要做什么
            @Override
            public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                System.out.println("执行方法前。。。");
                //调用原有方法
//                Object invoke = methodProxy.invokeSuper(object, args);
              Object invoke = method.invoke(t,args);// 作用等同与上面。
                System.out.println("执行方法后。。。");
                return invoke;
            }
        });
        Object proxyObj = en.create();//生成代理对象
        return proxyObj;
    }
}
class Car{
    public String run(String s){
        System.out.println(s+"正在跑");
        return s;
    }
}
